#include<bits/stdc++.h>
using namespace std;
int n;

int k[1000001];

int cnt;
struct node{
	int x;
	int i;
}q[4000001];
bool cmp(node&a,node&b) {
	return a.x<b.x;
} 

int ds[4000000];

int tot;
int g[1000001];
int s[4000001];

int e[4000001];
int re[4000001];
int f[4000001];

int it,sum;
int gds[4000001];
int lst[4000001];
bool r[4000001];
void add(int x,int y) {
	if(r[x]) gds[lst[x]]--,gds[y]++;
	else sum++,gds[y]++;
	r[x]=1;
	lst[x]=y;
	while(sum==n&&gds[it]==0)
		it++;
}

int main(){
	freopen("contest.in","r",stdin);
	freopen("contest.out","w",stdout);
	ios::sync_with_stdio(false);
	cin.tie(0),cout.tie(0);
	cin>>n;
	for(int i=0;i<n;i++) {
		cin>>k[i];
		for(int j=0;j<k[i];j++) {
			int g;
			cin>>g;
			q[cnt++]=(node){g,i};			
		}
	}
	
	sort(q,q+cnt,cmp);
	
	for(int i=0;i<cnt;i++) {
		if(i==0) ds[tot]=q[i].x,tot++;
		else if(q[i].x!=q[i-1].x) ds[tot]=q[i].x,tot++;
		q[i].x=tot-1;	
		e[tot-1]++;
	}
	
	for(int i=0;i<tot;i++) 
		re[i+1]=re[i]+e[i],e[i]=0;
	for(int i=0;i<cnt;i++)
		f[re[q[i].x]+(e[q[i].x]++)]=q[i].i;
	
	int ans=INT_MAX;
	for(int i=0;i<tot;i++) {
		for(int j=0;j<e[i];j++)
			add(f[re[i]+j],i);
		if(sum==n) 
			ans=min(ans,ds[i]-ds[it]);
	}
	cout<<ans;
	return 0;
}
